# author：LiuShihao
# data: 2020/11/24 9:14 上午
# desc:  循环语句

"""
内置函数 range()   用于生成一个整数序列
三种方式：range(stop) 从0开始，结束   range(start,stop)开始，结束   range(start,stop,step)   开始 ，结束，步长
返回值是一个迭代器对象
range类型的优点： 不管range对象表示的整数序列有多长，所有rangedu对象占用的内存空间都是相同的，因为仅仅需要存储start，stop，step
只有当用到range对象时，才会去计算序列中的相关元素
"""
# 第一种方式
r = range(10)    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  从0 开始 不包括10
print(list(r))   # 用于查看range对象中的整数序列，  list是列表的意思
r = range(1,10)  #[1, 2, 3, 4, 5, 6, 7, 8, 9]    指定从1开始 默认步长为1  不包括10
print(list(r))
r = range(2,10,2) #[2, 4, 6, 8]   从2开始  步长为2  不包括10
print(list(r))
# 判断整数是否包含在 序列中
print(10 in r)
print(10 not in r)


"""
循环的分类   while  for-in
选择结构if与循环结构while的区别：
 if是判断一次，条件为True，执行一次
 while是判断N+1次，条件为True，执行N次
while 语法结构
while 条件表达式:
    循环体
"""
a = 1
while a<10:
    print(a)
    a+=1
"""
计算0到4之间的累加和
4步 循环法：
1.初始化变量
2.条件判断
3.循环体
4.改变变量
"""
# 初始化变量
a = 0
sum = 0
# 条件判断
while a<5:
    # 循环体
    sum+=a
    # 改变变量
    a+=1
print("和为：",sum)
# 计算1到100的偶数和
a = 1
sum = 0
while a<=100:
    if a%2 == 0:    # if not a%2 :   另一种写法    0的布尔值为False
     sum += a
    a +=1
print("0到100之内的偶数和是：",sum)
a = 1
sum = 0
while a<=100:
    if a%2:
     sum += a
    a +=1
print("0到100之内的奇数和是：",sum)
"""
for-in 循环
in表达从字符串、序列等中依次取值，又称遍历，for-in遍历对象必须是可迭代的对象，循环体内不需要访问自定义变量，可以将自定义变量替代为下划线_
语法结构：
for 自定义变量 in 可迭代对象:
 循环体
"""
r = range(10)
for i in r:
    print(i)
for item in 'Python':
    print(item)
# 如果在循环体中不需要用到自定义变量，可以用下划线代替
for _ in range(5):
    print("人生苦短，我用Python")
# 使用for-in计算1到100之间的偶数和
print("0的布尔值为",bool(0))
sum = 0
for i in range(0,101,2):
    if not i%2:
        sum+=i
print("1到100之间的偶数和为：",sum)
i,sum = 0,0
for i in range(1,101):
    if i%2 == 0:
        sum += i
print("1到100之间的偶数和为：", sum)
"""
输出100到999之间的水仙花数   举例：153 = 1^3+5^3+3^3
"""
for item in range(100,1000):
    ge =item%10         # 个位上的数       对10取余
    shi = item //10%10    # 十位上的数  整除10，再对10取余
    bai = item // 100    # 百位上的数  对100整除
    # print(ge,shi,bai)
    if ge**3+shi**3+bai**3 == item:
        print("水仙花数：",item)
"""
break语句 用于结束循环语句通常与分支结构if一起使用
for ... in ...:
    ...
    if...:
        break
        
while ...:
    ...
    if...:
        break
        
"""
# 从键盘录入密码，最多输入三次，如果正确就结束循环
num = 1
while num<=3:
    pwd = int(input("请输入密码："))
    if pwd == 8888:
        print("密码正确")
        break
    print("密码错误，还有"+str((3-num))+"次机会，请重试")
    num +=1
"""
continue  用于结束当前循环，进入到下一循环，通常与分支结构if一起使用
for ... in ...:
    ...
    if...:
        continue
        
while ...:
    ...
    if...:
        continue
要求输出1到50之间所5 的倍数   
  谁是5的倍数？  和5的余数为0 的数都是5的倍数
  谁不是5的倍数？ 和5的余数不为0 的数都是5的倍数
"""
for item in range(1,51):
    if  not item % 5 :   # 余数为0  0 的布尔值是False  取反 为True
        print(item,"是5的倍数")

for item in range(1,51):
    if item % 5:
        continue
    print(item,"是5的倍数")
"""
else语句   与else语句配合使用的三种情况:
1.if条件语句不成立时执行else
2.while循环语句没有break时执行else
3.for-in循环语句没有break时执行else
"""
# for-in else 结构
for i in range(3):
    pwd = input("请输入密码")
    if pwd == '8888':
        print("密码正确")
        break
    else:
        print("密码错误")
else:
    print("账号已经冻结，请联系工作人员")
# while else结构
i = 0
while i<3:
    pwd = input("请输入密码")
    if pwd == '8888':
        print("密码正确")
        break
    else:
        print("密码错误")
    i+=1
else:
    print("账号已经冻结，请联系工作人员")
"""
嵌套循环：循环结构中又嵌套了另外的循环结构，其中内层循环结构作为外层循环结构的循环体  
"""
# 输出一个三行四列的矩阵
for i in range(1,4):   # 循环三次   每次一行
    for j in range(1,5):
        print("*",end="\t")   # 不换行
    print()   # 换行
# 打印九九星星
for i in range(1,10):
    for j in range(1,i+1):
        print("*",end="")
    print()
# 打印九九乘法表
for i in range(1,10):
    for j in range(1,i+1):
        # print(str(j)+"*"+str(i)+"="+str(i*j),end="\t")
        print(j,"*",i,"=",i*j, end="\t")
    print()
# 二层循环中，brank和continue用于控制本层循环






